package com.molichuxing.services.infrastructure.service;

import com.molichuxing.framework.dto.Paged;
import com.molichuxing.framework.service.RootService;
import com.molichuxing.services.infrastructure.dto.request.create.StoreCreateDto;
import com.molichuxing.services.infrastructure.dto.request.modify.StoreModifyDto;
import com.molichuxing.services.infrastructure.dto.response.StoreDto;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 门店表 服务类
 * </p>
 *
 * @author
 * @since 2019-08-12
 */
public interface StoreService extends RootService {

    /**
     * 通过ID集合获取门店信息
     *
     * @param ids
     * @return
     */
    public Map<Integer, StoreDto> getStoreMapByIds(List<Integer> ids) throws Exception;

    /**
     * 通过ID集合获取门店信息
     *
     * @param ids
     * @return
     */
    public List<StoreDto> getStoreListByIds(List<Integer> ids);

    /**
     * 通过id获取门店信息
     *
     * @param id
     * @return
     */
    public StoreDto getStoreById(Integer id) throws Exception;

    /**
     * 获取门店基础信息分页列表
     *
     * @param map      key:dealerId Integer 经销商id
     *                 key:status Integer 营业状态
     *                 key:verifyStatus Integer 审核状态
     *                 key:shortName String 门店名称
     *                 key：regionId Integer 区域ID
     *                 key:startApplyTime LocalDateTime 申请开始时间
     *                 key:endApplyTime LocalDateTime 申请结束时间
     * @param pageNum
     * @param pageSize
     * @return
     */
    Paged<StoreDto> getStorePage(Map<String, Object> map, Integer pageNum, Integer pageSize) throws Exception;

    /**
     * 通过经销商id获取门店数量
     *
     * @param ids
     * @return
     */
    public Map<Integer, Integer> getStoreCountByIds(List<Integer> ids) throws Exception;

    /**
     * 门店添加
     *
     * @param storeCreateDto
     * @return
     */
    Integer createStore(StoreCreateDto storeCreateDto) throws Exception;

    /**
     * 门店修改
     *
     * @param storeModifyDto
     * @return
     */
    Boolean modifyStore(StoreModifyDto storeModifyDto) throws Exception;

    /**
     * 根据门店id修改门店状态
     *
     * @param storeId
     * @param status
     * @return
     * @throws Exception
     */
    Boolean modifyStoreStatusByStoreId(Integer storeId, Integer status, Integer statusModifyType) throws Exception;

    /**
     * 根据经销商修改门店状态
     *
     * @param dealerId
     * @param status
     * @return
     * @throws Exception
     */
    Boolean modifyStoreStatusByDealerId(Integer dealerId, Integer status, Integer statusModifyType) throws Exception;

    /**
     * 门店审核
     *
     * @param id
     * @param verifyStatus
     * @param rejectReason
     * @param remark
     * @return
     * @throws Exception
     */
    public Boolean modifyVerifyStatus(Integer id, Integer verifyStatus,
                                      String rejectReason, String remark) throws Exception;

    /**
     * 获取门店列表
     *
     * @param map key:brandId 品牌id
     *            key:dealerId 经销商id
     *            key:regionId 区域id
     * @return
     * @throws Exception
     */
    public List<StoreDto> getStoreList(Map<String, Object> map);

    /**
     * 获取所有门店
     *
     * @return
     * @throws Exception
     */
    public List<StoreDto> getAllStoreList(Integer status) throws Exception;


    /**
     * 根据状态获取门店数量
     *
     * @return
     * @throws Exception
     */
    Map<Integer, Integer> getStoreCountByStatus(Integer dealerId) throws Exception;

    /**
     * 根据审核状态获取门店数量
     *
     * @return
     * @throws Exception
     */
    Map<Integer, Integer> getStoreCountByVerifyStatus(Integer dealerId) throws Exception;

    /**
     * 获取门店数量
     *
     * @return
     */
    Integer getCount(Integer dealerId);

    /**
     * 通过经销商id 查询门店集合（营业中）
     *
     * @param dealerId
     * @return
     */
    List<Integer> getStoreIdByDealer(Integer dealerId);

    /**
     * 通过经销商id 查询门店集合（全部）
     *
     * @param dealerId
     * @return
     */
    List<Integer> getAllStoreIdByDealer(Integer dealerId);

    /**
     * 门店名称是否存在
     *
     * @param shortName
     * @return
     */
    public Boolean getShortNameExist(String shortName);

    /**
     * 门店全称是否存在
     *
     * @param fullName
     * @return
     */
    public Boolean getFullNameExist(String fullName);

    /**
     * 获取门店信息
     *
     * @param dealerId 经销商
     * @return
     */
    public List<StoreDto> getByDealer(Integer dealerId);

    /**
     * 通过区域获取门店数量
     *
     * @param regionId
     * @param status
     * @return
     */
    public Integer getCountByRegionId(Integer regionId, Integer status);

    /**
     * 获取门店城市
     *
     * @return
     */
    public List<Integer> getRegionId();

    /**
     * 获取4s门店
     *
     * @param shortName
     * @return
     */
    public List<StoreDto> getFoursStore(String shortName);

    /**
     * 获取门店信息(营业中)
     *
     * @param dealerId 经销商
     * @return
     */
    public List<StoreDto> getStoreByDealer(Integer dealerId);

    /**
     * 获取门店数量
     *
     * @param map
     * @return
     */
    public Integer getStoreCount(Map<String, Object> map);


    /**
     * 获取门店集合（全部）
     *
     * @param ids
     * @return
     */
    public List<StoreDto> getAllStoreListByIds(List<Integer> ids);

    /**
     * 获取门店信息-根据简称模糊查询
     *
     * @param shortName 门店简称
     * @return
     */
    public List<StoreDto> getStoreByShortNameFuzzy(String shortName);

    /**
     * 根据门店名称模糊查询
     *
     * @param shortName
     * @param status
     * @return
     */
    public List<StoreDto> getStoreByShortNameFuzzy(String shortName, Integer status, Integer isShow, List<Integer> dealerIdList);

    /**
     * 获取门店城市
     *
     * @return
     */
    public List<Integer> getRegionId(Integer dealerId);

    /**
     * 获取门店信息
     * @param storeIdList
     * @param status
     * @param notStoreIdList
     * @return
     */
	public List<StoreDto> getStoreListByIdsAndStatus(List<Integer> storeIdList, Integer status ,List<Integer> notStoreIdList);
}
